package org.inet.minispring.bean.beandefinition;


import java.util.*;

public class ArgumentValues {

    private final Map<Integer, ArgumentValue> indexedArgumentValues = new HashMap<>();

    private final List<ArgumentValue> genericArgumentValues = new LinkedList<>();

    public ArgumentValues() {}

    private void addArgumentValue(Integer key, ArgumentValue v) {
        this.indexedArgumentValues.put(key, v);
    }

    public boolean hasIndexedArgumentValue(int index) {
        return this.indexedArgumentValues.containsKey(index);
    }

    public ArgumentValue getIndexedArgumentValue(int index) {
        return this.indexedArgumentValues.get(index);
    }

    public void addGenericArgumentValue(Object value, String type) {
        this.genericArgumentValues.add(new ArgumentValue(value, type));
    }

    private void addGenericArgumentValue(ArgumentValue argumentValue) {
        String argName = argumentValue.getName();
        if (argName != null) {
            genericArgumentValues.removeIf(current -> argName.equals(current.getName()));
        }
        this.genericArgumentValues.add(argumentValue);
    }

    public ArgumentValue getGenericArgumentValue(String requiredName) {
        if (Objects.isNull(requiredName)) {
            return null;
        }
        var target = genericArgumentValues.stream().filter(v -> requiredName.equals(v.getName())).findFirst();
        return target.orElse(null);
    }

    public int getArgumentCount() {
        return genericArgumentValues.size();
    }

    public boolean isEmpty() {
        return genericArgumentValues.isEmpty();
    }
}
